Для заданного целого числа x найдите количество таких целых чисел a, которые удовлетворяют условиям:
·
a xor x > x
·
0 < a < x
где xor – битовый XOR
оператор.
Имеются q запросов, каждый из которых содержит целое число x. Для каждого запроса выведите общее
количество значений a,
удовлетворяющих условиям выше.
Вход. Первая
строка содержит число запросов q (1 ≤ q ≤ 105).
Каждая из следующих q строк
содержит значение x (1 ≤ x ≤ 1010).
Выход. Для
каждого теста выведите в отдельной строке количество значений a, удовлетворяющих приведенным условиям.
Пример
входа |
Пример
выхода |
2 2 10 |
1 5 |
математика
Рассмотрим
двоичное представление числа x = bkbk-1…b2b1b0. Если некоторое bi равно 0, то на
его месте можно поставить 1, а на позициях bi-1…b0 может находиться любое число. То есть при bi = 0 любое
значение a = 1bi-1…b0
нам
подходит (a xor x > x, 0 < a < x). Таких возможных значений a имеется 2i.
Остается
перебрать все позиции i, для которых bi = 0 и просуммировать значения 2i.
Пример
Число x = 78 в двоичном представлении имеет вид 1001110.
Читаем входные данные:.
scanf("%lld",
&q);
while (q--)
{
scanf("%lld",
&x);
res = 0;
В переменной i перебираем индексы битов числа x.
for (i =
0; x > 0; i++)
{
Если i-ый бит числа x равен 0,
то к сумме прибавляем 2i.
if (x %
2 == 0) res += (1LL << i);
x /= 2;
}
Выводим ответ.
printf("%lld\n",
res);
}